home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 27 / CU Amiga Magazine's Super CD-ROM 27 (1998)(EMAP Images)(GB)[!][issue 1998-10].iso / CUCD / Programming / BlitzC2P / c2pGenericCLS.ascii < prev    next >
Text File  |  1998-08-01  |  9KB  |  522 lines

  1. WBStartup
  2. NoCli
  3.  
  4. ; CLEARSCREEN version. Additional code by Paul West.
  5.  
  6. ; Non-clearscreen results:
  7.  
  8. ; 040/25 results:
  9.  
  10. ; 320x200 @42fps DoublePAL or 44fps PAL
  11. ; 320x256 @31fps DoublePAL or 34fps PAL
  12. ; 320x240 @33.7fps DoublePAL or 36.5fps PAL
  13.  
  14. #c2pBPLX=320
  15. #c2pBPLY=256
  16. #c2pBPLSIZE=(#c2pBPLX*#c2pBPLY)/8
  17.  
  18. #scrwidth=#c2pBPLX
  19. #scrheight=#c2pBPLY
  20. #screensize=#scrwidth*#scrheight
  21.  
  22. #clearscreento=$00000000
  23.  
  24. ; 060 friendly version
  25. ;       modulo  max res fscreen compu
  26. ; c2p1x1_8_c5     no  320x256?  no  030
  27.  
  28. Statement c2pGenericInit{A.l,B.l}
  29.  
  30.   ;A.l=d0=Width.w
  31.   ;B.l=d1=Height.w
  32.  
  33. ; d0.w  chunkyx [chunky-pixels]
  34. ; d1.w  chunkyy [chunky-pixels]
  35. ; d3.w  scroffsy [screen-pixels]
  36.  
  37.   MOVEQ.l #0,d3 ; Y offset
  38.  
  39. c2p1x1_8_c5_init
  40.   LEA c2p_datanew(pc),a0
  41.   ANDI.l  #$ffff,d0
  42.   MULU.w  d0,d3
  43.   LSR.l #3,d3
  44.   MOVE.l  d3,c2p_scroffs-c2p_data(a0)
  45.   MULU.w  d0,d1
  46.   MOVE.l  d1,c2p_pixels-c2p_data(a0)
  47. AsmExit
  48. End Statement
  49.  
  50. Statement c2pGeneric{A.l,B.l}
  51.  
  52.   MOVE.l  d0,a0 ; Chunky
  53.   MOVE.l  d1,a1 ; Planar
  54.  
  55. ; a0  c2pscreen
  56. ; a1  bitplanes
  57.  
  58. c2p1x1_8_c5
  59.   MOVEM.l a3-a6,-(a7)
  60.  
  61.   MOVEM.l a0-a1,-(a7)
  62.   LEA c2p_datanew,a0
  63.   LEA c2p_data,a1
  64.   MOVEQ #16-1,d0
  65. _c2pcopy: MOVE.l  (a0)+,(a1)+
  66.   DBF d0,_c2pcopy
  67.   MOVEM.l (a7)+,a0-a1
  68.  
  69.   LEA c2p_data(pc),a2
  70.  
  71.   MOVE.l  #$33333333,d5
  72.   MOVE.l  #$55555555,a6
  73.  
  74.   ADD.w #c2pBPLSIZE,a1
  75.   ADD.l c2p_scroffs-c2p_data(a2),a1
  76.  
  77.   MOVE.l  c2p_pixels-c2p_data(a2),a2
  78.   ADD.l a0,a2
  79.   CMP.l a0,a2
  80.   BEQ _none
  81.  
  82.   MOVEM.l a0-a1,-(a7)
  83.  
  84.   MOVE.l  (a0),d0
  85.   MOVE.l  #clearscreento,(a0)+
  86.   MOVE.l  (a0),d2
  87.   MOVE.l  #clearscreento,(a0)+
  88.   MOVE.l  (a0),d1
  89.   MOVE.l  #clearscreento,(a0)+
  90.   MOVE.l  (a0),d3
  91.   MOVE.l  #clearscreento,(a0)+
  92.  
  93.   MOVE.l  #$0f0f0f0f,d4   ; Merge 4x1, part 1
  94.   AND.l d4,d0
  95.   AND.l d4,d1
  96.   AND.l d4,d2
  97.   AND.l d4,d3
  98.   LSL.l #4,d0
  99.   LSL.l #4,d1
  100.   OR.l  d2,d0
  101.   OR.l  d3,d1
  102.  
  103.   MOVE.l  (a0),d2
  104.   MOVE.l  #clearscreento,(a0)+
  105.   MOVE.l  (a0),d6
  106.   MOVE.l  #clearscreento,(a0)+
  107.   MOVE.l  (a0),d3
  108.   MOVE.l  #clearscreento,(a0)+
  109.   MOVE.l  (a0),d7
  110.   MOVE.l  #clearscreento,(a0)+
  111.  
  112.   AND.l d4,d2     ; Merge 4x1, part 2
  113.   AND.l d4,d6
  114.   AND.l d4,d3
  115.   AND.l d4,d7
  116.   LSL.l #4,d2
  117.   LSL.l #4,d3
  118.   OR.l  d6,d2
  119.   OR.l  d7,d3
  120.  
  121.   MOVE.w  d2,d6     ; Swap 16x2
  122.   MOVE.w  d3,d7
  123.   MOVE.w  d0,d2
  124.   MOVE.w  d1,d3
  125.   SWAP  d2
  126.   SWAP  d3
  127.   MOVE.w  d2,d0
  128.   MOVE.w  d3,d1
  129.   MOVE.w  d6,d2
  130.   MOVE.w  d7,d3
  131.  
  132.   MOVE.l  d2,d6     ; Swap 2x2
  133.   MOVE.l  d3,d7
  134.   LSR.l #2,d6
  135.   LSR.l #2,d7
  136.   EOR.l d0,d6
  137.   EOR.l d1,d7
  138.   AND.l d5,d6
  139.   AND.l d5,d7
  140.   EOR.l d6,d0
  141.   EOR.l d7,d1
  142.   LSL.l #2,d6
  143.   LSL.l #2,d7
  144.   EOR.l d6,d2
  145.   EOR.l d7,d3
  146.  
  147.   MOVE.l  #$00ff00ff,d4
  148.   MOVE.l  d1,d6     ; Swap 8x1
  149.   MOVE.l  d3,d7
  150.   LSR.l #8,d6
  151.   LSR.l #8,d7
  152.   EOR.l d0,d6
  153.   EOR.l d2,d7
  154.   BRA _start1
  155. _x1
  156.   MOVE.l  (a0),d0
  157.   MOVE.l  #clearscreento,(a0)+
  158.   MOVE.l  (a0),d2
  159.   MOVE.l  #clearscreento,(a0)+
  160.   MOVE.l  (a0),d1
  161.   MOVE.l  #clearscreento,(a0)+
  162.   MOVE.l  (a0),d3
  163.   MOVE.l  #clearscreento,(a0)+
  164.   MOVE.l  d7,-c2pBPLSIZE(a1)
  165.  
  166.   MOVE.l  #$0f0f0f0f,d4   ; Merge 4x1, part 1
  167.   AND.l d4,d0
  168.   AND.l d4,d1
  169.   AND.l d4,d2
  170.   AND.l d4,d3
  171.   LSL.l #4,d0
  172.   LSL.l #4,d1
  173.   OR.l  d2,d0
  174.   OR.l  d3,d1
  175.  
  176.   MOVE.l  (a0),d2
  177.   MOVE.l  #clearscreento,(a0)+
  178.   MOVE.l  (a0),d6
  179.   MOVE.l  #clearscreento,(a0)+
  180.   MOVE.l  (a0),d3
  181.   MOVE.l  #clearscreento,(a0)+
  182.   MOVE.l  (a0),d7
  183.   MOVE.l  #clearscreento,(a0)+
  184.   MOVE.l  a3,c2pBPLSIZE(a1)
  185.  
  186.   AND.l d4,d2     ; Merge 4x1, part 2
  187.   AND.l d4,d6
  188.   AND.l d4,d3
  189.   AND.l d4,d7
  190.   LSL.l #4,d2
  191.   LSL.l #4,d3
  192.   OR.l  d6,d2
  193.   OR.l  d7,d3
  194.  
  195.   MOVE.w  d2,d6     ; Swap 16x2
  196.   MOVE.w  d3,d7
  197.   MOVE.w  d0,d2
  198.   MOVE.w  d1,d3
  199.   SWAP  d2
  200.   SWAP  d3
  201.   MOVE.w  d2,d0
  202.   MOVE.w  d3,d1
  203.   MOVE.w  d6,d2
  204.   MOVE.w  d7,d3
  205.   MOVE.l  a4,c2pBPLSIZE*2(a1)
  206.  
  207.   MOVE.l  d2,d6     ; Swap 2x2
  208.   MOVE.l  d3,d7
  209.   LSR.l #2,d6
  210.   LSR.l #2,d7
  211.   EOR.l d0,d6
  212.   EOR.l d1,d7
  213.   AND.l d5,d6
  214.   AND.l d5,d7
  215.   EOR.l d6,d0
  216.   EOR.l d7,d1
  217.   LSL.l #2,d6
  218.   LSL.l #2,d7
  219.   EOR.l d6,d2
  220.   EOR.l d7,d3
  221.  
  222.   MOVE.l  #$00ff00ff,d4
  223.   MOVE.l  d1,d6     ; Swap 8x1
  224.   MOVE.l  d3,d7
  225.   LSR.l #8,d6
  226.   LSR.l #8,d7
  227.   EOR.l d0,d6
  228.   EOR.l d2,d7
  229.   MOVE.l  a5,(a1)+
  230. _start1
  231.   AND.l d4,d6
  232.   AND.l d4,d7
  233.   EOR.l d6,d0
  234.   EOR.l d7,d2
  235.   LSL.l #8,d6
  236.   LSL.l #8,d7
  237.   EOR.l d6,d1
  238.   EOR.l d7,d3
  239.  
  240.   MOVE.l  a6,d4
  241.   MOVE.l  d1,d6     ; Swap 1x1
  242.   MOVE.l  d3,d7
  243.   LSR.l #1,d6
  244.   LSR.l #1,d7
  245.   EOR.l d0,d6
  246.   EOR.l d2,d7
  247.   AND.l d4,d6
  248.   AND.l d4,d7
  249.   EOR.l d6,d0
  250.   EOR.l d7,d2
  251.   ADD.l d6,d6
  252.   ADD.l d7,d7
  253.   EOR.l d1,d6
  254.   EOR.l d3,d7
  255.  
  256.   MOVE.l  d0,a4
  257.   MOVE.l  d2,a5
  258.   MOVE.l  d6,a3
  259.  
  260.   CMPA.l  a0,a2
  261.   BNE _x1
  262.   MOVE.l  d7,-c2pBPLSIZE(a1)
  263.   MOVE.l  a3,c2pBPLSIZE(a1)
  264.   MOVE.l  a4,c2pBPLSIZE*2(a1)
  265.   MOVE.l  a5,(a1)+
  266.  
  267.   MOVEM.l (a7)+,a0-a1
  268.   ADD.l #c2pBPLSIZE*4,a1
  269.  
  270.   MOVE.l  (a0),d0
  271.   MOVE.l  #clearscreento,(a0)+
  272.   MOVE.l  (a0),d2
  273.   MOVE.l  #clearscreento,(a0)+
  274.   MOVE.l  (a0),d1
  275.   MOVE.l  #clearscreento,(a0)+
  276.   MOVE.l  (a0),d3
  277.   MOVE.l  #clearscreento,(a0)+
  278.  
  279.   MOVE.l  #$f0f0f0f0,d4   ; Merge 4x1, part 1
  280.   AND.l d4,d0
  281.   AND.l d4,d1
  282.   AND.l d4,d2
  283.   AND.l d4,d3
  284.   LSR.l #4,d2
  285.   LSR.l #4,d3
  286.   OR.l  d2,d0
  287.   OR.l  d3,d1
  288.  
  289.   MOVE.l  (a0),d2
  290.   MOVE.l  #clearscreento,(a0)+
  291.   MOVE.l  (a0),d6
  292.   MOVE.l  #clearscreento,(a0)+
  293.   MOVE.l  (a0),d3
  294.   MOVE.l  #clearscreento,(a0)+
  295.   MOVE.l  (a0),d7
  296.   MOVE.l  #clearscreento,(a0)+
  297.  
  298.   AND.l d4,d2     ; Merge 4x1, part 2
  299.   AND.l d4,d6
  300.   AND.l d4,d3
  301.   AND.l d4,d7
  302.   LSR.l #4,d6
  303.   LSR.l #4,d7
  304.   OR.l  d6,d2
  305.   OR.l  d7,d3
  306.  
  307.   MOVE.w  d2,d6     ; Swap 16x2
  308.   MOVE.w  d3,d7
  309.   MOVE.w  d0,d2
  310.   MOVE.w  d1,d3
  311.   SWAP  d2
  312.   SWAP  d3
  313.   MOVE.w  d2,d0
  314.   MOVE.w  d3,d1
  315.   MOVE.w  d6,d2
  316.   MOVE.w  d7,d3
  317.  
  318.   MOVE.l  d2,d6     ; Swap 2x2
  319.   MOVE.l  d3,d7
  320.   LSR.l #2,d6
  321.   LSR.l #2,d7
  322.   EOR.l d0,d6
  323.   EOR.l d1,d7
  324.   AND.l d5,d6
  325.   AND.l d5,d7
  326.   EOR.l d6,d0
  327.   EOR.l d7,d1
  328.   LSL.l #2,d6
  329.   LSL.l #2,d7
  330.   EOR.l d6,d2
  331.   EOR.l d7,d3
  332.  
  333.   MOVE.l  #$00ff00ff,d4
  334.   MOVE.l  d1,d6     ; Swap 8x1
  335.   MOVE.l  d3,d7
  336.   LSR.l #8,d6
  337.   LSR.l #8,d7
  338.   EOR.l d0,d6
  339.   EOR.l d2,d7
  340.   BRA _start2
  341. _x2
  342.   MOVE.l  (a0),d0
  343.   MOVE.l  #clearscreento,(a0)+
  344.   MOVE.l  (a0),d2
  345.   MOVE.l  #clearscreento,(a0)+
  346.   MOVE.l  (a0),d1
  347.   MOVE.l  #clearscreento,(a0)+
  348.   MOVE.l  (a0),d3
  349.   MOVE.l  #clearscreento,(a0)+
  350.   MOVE.l  d7,-c2pBPLSIZE(a1)
  351.  
  352.   MOVE.l  #$f0f0f0f0,d4   ; Merge 4x1, part 1
  353.   AND.l d4,d0
  354.   AND.l d4,d1
  355.   AND.l d4,d2
  356.   AND.l d4,d3
  357.   LSR.l #4,d2
  358.   LSR.l #4,d3
  359.   OR.l  d2,d0
  360.   OR.l  d3,d1
  361.  
  362.   MOVE.l  (a0),d2
  363.   MOVE.l  #clearscreento,(a0)+
  364.   MOVE.l  (a0),d6
  365.   MOVE.l  #clearscreento,(a0)+
  366.   MOVE.l  (a0),d3
  367.   MOVE.l  #clearscreento,(a0)+
  368.   MOVE.l  (a0),d7
  369.   MOVE.l  #clearscreento,(a0)+
  370.   MOVE.l  a3,c2pBPLSIZE(a1)
  371.  
  372.   AND.l d4,d2     ; Merge 4x1, part 2
  373.   AND.l d4,d6
  374.   AND.l d4,d3
  375.   AND.l d4,d7
  376.   LSR.l #4,d6
  377.   LSR.l #4,d7
  378.   OR.l  d6,d2
  379.   OR.l  d7,d3
  380.  
  381.   MOVE.w  d2,d6     ; Swap 16x2
  382.   MOVE.w  d3,d7
  383.   MOVE.w  d0,d2
  384.   MOVE.w  d1,d3
  385.   SWAP  d2
  386.   SWAP  d3
  387.   MOVE.w  d2,d0
  388.   MOVE.w  d3,d1
  389.   MOVE.w  d6,d2
  390.   MOVE.w  d7,d3
  391.   MOVE.l  a4,c2pBPLSIZE*2(a1)
  392.  
  393.   MOVE.l  d2,d6     ; Swap 2x2
  394.   MOVE.l  d3,d7
  395.   LSR.l #2,d6
  396.   LSR.l #2,d7
  397.   EOR.l d0,d6
  398.   EOR.l d1,d7
  399.   AND.l d5,d6
  400.   AND.l d5,d7
  401.   EOR.l d6,d0
  402.   EOR.l d7,d1
  403.   LSL.l #2,d6
  404.   LSL.l #2,d7
  405.   EOR.l d6,d2
  406.   EOR.l d7,d3
  407.  
  408.   MOVE.l  #$00ff00ff,d4
  409.   MOVE.l  d1,d6     ; Swap 8x1
  410.   MOVE.l  d3,d7
  411.   LSR.l #8,d6
  412.   LSR.l #8,d7
  413.   EOR.l d0,d6
  414.   EOR.l d2,d7
  415.   MOVE.l  a5,(a1)+
  416. _start2
  417.   AND.l d4,d6
  418.   AND.l d4,d7
  419.   EOR.l d6,d0
  420.   EOR.l d7,d2
  421.   LSL.l #8,d6
  422.   LSL.l #8,d7
  423.   EOR.l d6,d1
  424.   EOR.l d7,d3
  425.  
  426.   MOVE.l  a6,d4
  427.   MOVE.l  d1,d6     ; Swap 1x1
  428.   MOVE.l  d3,d7
  429.   LSR.l #1,d6
  430.   LSR.l #1,d7
  431.   EOR.l d0,d6
  432.   EOR.l d2,d7
  433.   AND.l d4,d6
  434.   AND.l d4,d7
  435.   EOR.l d6,d0
  436.   EOR.l d7,d2
  437.   ADD.l d6,d6
  438.   ADD.l d7,d7
  439.   EOR.l d1,d6
  440.   EOR.l d3,d7
  441.  
  442.   MOVE.l  d0,a4
  443.   MOVE.l  d2,a5
  444.   MOVE.l  d6,a3
  445.  
  446.   CMPA.l  a0,a2
  447.   BNE _x2
  448.   MOVE.l  d7,-c2pBPLSIZE(a1)
  449.   MOVE.l  a3,c2pBPLSIZE(a1)
  450.   MOVE.l  a4,c2pBPLSIZE*2(a1)
  451.   MOVE.l  a5,(a1)+
  452.  
  453. _none
  454.   MOVEM.l (a7)+,a3-a6
  455.   AsmExit
  456.  
  457.   Even4
  458. c2p_data
  459. c2p_screen: Dc.l 0
  460. c2p_scroffs: Dc.l 0
  461. c2p_scroffs2: Dc.l 0
  462. c2p_c2pBPLSIZE: Dc.l 0
  463. c2p_pixels: Dc.l 0
  464.   Ds.l  16
  465.   Even4
  466. c2p_datanew
  467.   Ds.l  16
  468. End Statement
  469.  
  470.  
  471.  
  472. .blitzprogram
  473. ; Setup
  474. InitBank 0,(#scrwidth*#scrheight)+1000,2|65536 ; Chipram planar buffer
  475. CludgeBitMap 0,#scrwidth,#scrheight,8,Bank(0)
  476. InitPalette 0,256
  477. For c=0 To 255
  478.   AGAPalRGB 0,c,Rnd(c),Rnd(c),Rnd(c)
  479. Next c
  480. AGAPalRGB 0,0,0,0,0
  481. Screen 0,0,0,#scrwidth,#scrheight,8,0,"c2p test",0,0,0
  482. Use Palette 0
  483. VWait 50
  484. baseaddress1.l=AllocMem(#scrwidth*#scrheight,$10000) ; Fastram chunky buffer
  485.  
  486. ; Put something into the chunky buffer so we can see it working
  487. GetReg a0,baseaddress1
  488. MOVE.l  #0,d0
  489. MOVE.l  #screensize-1,d1
  490. cloop
  491.   MOVE.b  d0,(a0)+
  492.   ADDQ.l  #1,d0
  493.   SUBQ.l  #1,d1
  494.   TST.l   d1
  495.   BLT     done
  496.   BRA     cloop
  497. done
  498.  
  499. ; Do the c2p test
  500. c2pGenericInit{#scrwidth,#scrheight}
  501. VWait 20
  502. Forbid_
  503. VWait
  504. ResetTimer
  505. For time=1 To 800
  506.   c2pGeneric{baseaddress1,Bank(0)} ; Convert chunky to planar
  507. Next time
  508. t=Ticks
  509. VWait 2 : Permit_
  510. VWait 20
  511. FindScreen 0
  512. Window 0,0,11,640,100,0,"Test results for c2p",0,0
  513. WindowOutput 0
  514. NPrint "Routine performed @ ",50/(t/800),"fps - ",t," ticks"
  515. NPrint " "
  516. NPrint "Press mousebutton..."
  517. Free Screen 0
  518. MouseWait
  519. Free Window 0
  520. End
  521.  
  522.